package vista;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.BevelBorder;

import controle.Simulator;
import extra.Constantes;

import modelo.Host;

public class Janela extends JFrame implements WindowListener,ActionListener,ItemListener {
	private static final long serialVersionUID = 1L;
	  
	private JPanel jContentPane;
	
	private JPanel jPanelSimulador;
	private JPanel jPanelEscolhaCenario;
	private JLabel jLabelEscolhaCenario;
	private JButton jButtonCenario1;
	private JButton jButtonCenario2;
	private JButton jButtonCenario3;
	private JButton jButtonCenario4;  
	
	private JLabel jLabelDebug;
	private JCheckBox jCheckDebug; 
	  
	private JPanel jPanelResultados;
	private JLabel jLabelResultados;
	private JScrollPane scrollTextResultados;  
	private static JTextArea jTextAreaResultados;  
	  
	private static boolean debugging = false;
  
	public Janela() {
		super();
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		iniciar();
	}

	private void iniciar(){
		jContentPane = new JPanel();
		FlowLayout jContentPaneLayout = new FlowLayout();
		getContentPane().add(jContentPane, BorderLayout.EAST);
		setResizable(false);
		setTitle("EtherSIM Simulador");
		
		jContentPane.setLayout(jContentPaneLayout);
		
		jPanelSimulador = new JPanel();
		jPanelSimulador.setPreferredSize(new java.awt.Dimension(980, 580));
		jPanelSimulador.setLayout(null);    
	    jContentPane.add(jPanelSimulador);;
	    
		jPanelSimulador.add(getJPanelEscolhaCenario());
		
	    jPanelSimulador.add(getJPanelResultados());
	    
	    this.setSize(1000, 600);
	    this.setName("Ethersim");
  	}
	
	public JPanel getJPanelEscolhaCenario() {
		jPanelEscolhaCenario = new JPanel();
		jPanelEscolhaCenario.setLayout(null);
		jPanelEscolhaCenario.setBounds(20, 10, 940, 50);
		jPanelEscolhaCenario.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
		
		jLabelEscolhaCenario = new JLabel();
		jLabelEscolhaCenario.setText("Escolha de Cenário");
		jLabelEscolhaCenario.setFont(new java.awt.Font("Arial",1,14));
		jLabelEscolhaCenario.setBounds(10, 15, 200, 20);
		jPanelEscolhaCenario.add(jLabelEscolhaCenario);    
		
		jButtonCenario1 = new JButton();
		jButtonCenario1.setBounds(210, 12, 120, 25);
		jButtonCenario1.setEnabled(true);
		jButtonCenario1.setText("Cenario 1");
		jButtonCenario1.addActionListener(this);
		jPanelEscolhaCenario.add(jButtonCenario1);
		
		jButtonCenario2 = new JButton();
		jButtonCenario2.setBounds(340, 12, 120, 25);
		jButtonCenario2.setEnabled(true);
		jButtonCenario2.setText("Cenario 2");
		jButtonCenario2.addActionListener(this);
		jPanelEscolhaCenario.add(jButtonCenario2);
		      
		jButtonCenario3 = new JButton();
		jButtonCenario3.setBounds(470, 12, 120, 25);
		jButtonCenario3.setEnabled(true);
		jButtonCenario3.setText("Cenario 3");
		jButtonCenario3.addActionListener(this);    
		jPanelEscolhaCenario.add(jButtonCenario3);
		      
		jButtonCenario4 = new JButton();
		jButtonCenario4.setBounds(600, 12, 120, 25);
		jButtonCenario4.setEnabled(true);
		jButtonCenario4.setText("Cenario 4");
		jButtonCenario4.addActionListener(this);     
		jPanelEscolhaCenario.add(jButtonCenario4);
		
		jCheckDebug = new JCheckBox();
		jCheckDebug.setBounds(730, 15, 20, 20);
		jCheckDebug.addItemListener(this);
	    jPanelEscolhaCenario.add(jCheckDebug);
	    
	    jLabelDebug = new JLabel();
	    jLabelDebug.setText("Gerar Log");
	    jLabelDebug.setFont(new java.awt.Font("Arial",1,11));
	    jLabelDebug.setBounds(760, 15, 200, 20);
	    jPanelEscolhaCenario.add(jLabelDebug);  
		
		return jPanelEscolhaCenario;
	}
	
	public JPanel getJPanelResultados() {
		jPanelResultados = new JPanel();
		jPanelResultados.setLayout(null);
		jPanelResultados.setBounds(20, 70, 940, 490);
		jPanelResultados.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
		
		jLabelResultados = new JLabel();
		jLabelResultados.setText("Resultados");
		jLabelResultados.setFont(new java.awt.Font("Dialog",1,18));
		jLabelResultados.setBounds(385, 10, 150, 25);
		jPanelResultados.add(jLabelResultados);
		
		jTextAreaResultados = new JTextArea();
		scrollTextResultados = new JScrollPane(jTextAreaResultados);
		scrollTextResultados.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		scrollTextResultados.setBounds(20,40,900,430);
		
		jPanelResultados.add(scrollTextResultados);
		
	    return jPanelResultados;
	}
	
	@Override
	public void itemStateChanged(ItemEvent e) {
		 Object source = e.getItemSelectable();
	      
		if (source == jCheckDebug) {
			if (e.getStateChange() == ItemEvent.DESELECTED) {
				debugging = false;
			}
			else {
				debugging = true;
			}
		}
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		jTextAreaResultados.setText("");
	    
	    if (e.getSource().equals(jButtonCenario1)) {
	    	this.executaCenario1();
	    }
	    else {
	    	if(e.getSource().equals(jButtonCenario2)) {
	    		this.executaCenario2();
	    	}
	    	else {
		    	if(e.getSource().equals(jButtonCenario3)) {
		    		this.executaCenario3();
		    	}
		    	else {
			    	if(e.getSource().equals(jButtonCenario4)) {
			    		this.executaCenario4();
			    	}
			    }
		    }
	    }
	    jTextAreaResultados.select(0, 0);
	}

	private void executaCenario1() {
		ArrayList<Host> listaHosts = new ArrayList<Host>();
		
		listaHosts.add(new Host("A", 100, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 80, false, 40));
		listaHosts.add(new Host("B", 80, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 80, false, 40));
		listaHosts.add(new Host("C", 60, Constantes.TEMPO_TRANSMISSAO_ETHERNET, -1, false, 1));
		listaHosts.add(new Host("D", 40, Constantes.TEMPO_TRANSMISSAO_ETHERNET, -1, false, 1));
		
		Simulator simulador = new Simulator(listaHosts, Constantes.TEMPO_RODADA, Constantes.NUMERO_RODADAS);
		Janela.imprime("******************************************************************* CENÁRIO 1 *******************************************************************");
		simulador.iniciaSimulacao();
	}
	
	private void executaCenario2() {
		ArrayList<Host> listaHosts = new ArrayList<Host>();
		
		listaHosts.add(new Host("A", 100, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 80, true, 40));
		listaHosts.add(new Host("B", 80, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 80, true, 40));
		listaHosts.add(new Host("C", 60, Constantes.TEMPO_TRANSMISSAO_ETHERNET, -1, false, 1));
		listaHosts.add(new Host("D", 40, Constantes.TEMPO_TRANSMISSAO_ETHERNET, -1, false, 1));
		
		Simulator simulador = new Simulator(listaHosts, Constantes.TEMPO_RODADA, Constantes.NUMERO_RODADAS);
		Janela.imprime("******************************************************************* CENÁRIO 2 *******************************************************************");
		simulador.iniciaSimulacao();
	}
	
	private void executaCenario3() {
		ArrayList<Host> listaHosts = new ArrayList<Host>();
		
		listaHosts.add(new Host("A", 100, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 80, false, 40));
		listaHosts.add(new Host("B", 80, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 16, false, 1));
		listaHosts.add(new Host("C", 60, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 16, false, 1));
		listaHosts.add(new Host("D", 40, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 16, false, 1));
		
		Simulator simulador = new Simulator(listaHosts, Constantes.TEMPO_RODADA, Constantes.NUMERO_RODADAS);
		Janela.imprime("******************************************************************* CENÁRIO 3 *******************************************************************");
		simulador.iniciaSimulacao();
	}
	
	private void executaCenario4() {
		ArrayList<Host> listaHosts = new ArrayList<Host>();
		
		listaHosts.add(new Host("A", 100, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 80, false, 40));
		listaHosts.add(new Host("B", 80, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 16, true, 1));
		listaHosts.add(new Host("C", 60, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 16, true, 1));
		listaHosts.add(new Host("D", 40, Constantes.TEMPO_TRANSMISSAO_ETHERNET, 16, true, 1));
		
		Simulator simulador = new Simulator(listaHosts, Constantes.TEMPO_RODADA, Constantes.NUMERO_RODADAS);
		Janela.imprime("******************************************************************* CENÁRIO 4 *******************************************************************");
		simulador.iniciaSimulacao();
		
	}
	
	public static void imprime(String texto) {
		jTextAreaResultados.append(texto + "\n");
	}
	
	public static boolean isDebugging() {
		return debugging;
	}

	@Override
	public void windowActivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void windowClosed(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void windowClosing(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void windowDeactivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void windowDeiconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void windowIconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void windowOpened(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}